II. Infile
library(readxl)
raw <- read_excel("data/온라인쇼핑몰_판매매체별_상품군별거래액_20190328095024.xlsx", sheet = "데이터")
raw[1:6,1:6]
## # A tibble: 6 x 6
## 상품군별 판매매체별 `2017. 01` `2017. 02` `2017. 03` `2017. 04`
## <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 합계 계 7310479 7148849 7747011 7380795
## 2 <NA> 인터넷쇼핑 3390183 3298823 3585449 3304819
## 3 <NA> 모바일쇼핑 3920295 3850025 4161562 4075976
## 4 컴퓨터 및 주변기기 계 422384 475342 473351 368280
## 5 <NA> 인터넷쇼핑 288391 329143 322089 251604
## 6 <NA> 모바일쇼핑 133993 146200 151262 116675
III. Preprocessing
- Task 1:
상품군별의 NA 채워넣기
- Task 2:
M51을 참고하여 tidy dataset으로 만들기 (Year-Month를 나타내는 YM컬럼 생성)
- Task 3:
YM 변수의 값을 깔끔하게 정리
- Task 4:
Y와 M도 생성
- Task 5: Tidy dataset 완성 확인
Task 1: 상품군별의 NA 채워넣기
- 따라해보기
- 아래에서
x는 벡터를 zoo 타입으로 바꾸고 실행했는데,
- 해당 stackoverflow의 아래 쪽 댓글을 읽어보면
zoo 타입으로 바꾸는 것이 필수적이지는 않습니다.
- 즉,
y와 같이 할 수도 있습니다.
library(zoo)
x <- zoo(c(2,NA,1,4,5,2))
na.locf(x)
## 1 2 3 4 5 6
## 2 2 1 4 5 2
y <- c(2,NA,1,4,5,2)
na.locf(y)
## [1] 2 2 1 4 5 2
raw$상품군별 <- na.locf(raw$상품군별)
raw[1:6,1:6]
## # A tibble: 6 x 6
## 상품군별 판매매체별 `2017. 01` `2017. 02` `2017. 03` `2017. 04`
## <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 1 합계 계 7310479 7148849 7747011 7380795
## 2 합계 인터넷쇼핑 3390183 3298823 3585449 3304819
## 3 합계 모바일쇼핑 3920295 3850025 4161562 4075976
## 4 컴퓨터 및 주변기기 계 422384 475342 473351 368280
## 5 컴퓨터 및 주변기기 인터넷쇼핑 288391 329143 322089 251604
## 6 컴퓨터 및 주변기기 모바일쇼핑 133993 146200 151262 116675
Task 2: M51을 참고하여 tidy dataset으로 만들기
- Year-Month를 나타내는
YM컬럼 생성하여 tidy하게 만드는 것이 목표
M51의 table4a와 모양이 유사합니다.
- Trial and error의 과정을 거치다 보면 아래 명령어를 찾아낼 수 있습니다.
library(tidyverse)
my_tidy <- raw %>%
gather(colnames(raw)[-(1:2)], key = "YM", value = "Revenue")
head(my_tidy)
## # A tibble: 6 x 4
## 상품군별 판매매체별 YM Revenue
## <chr> <chr> <chr> <dbl>
## 1 합계 계 2017. 01 7310479
## 2 합계 인터넷쇼핑 2017. 01 3390183
## 3 합계 모바일쇼핑 2017. 01 3920295
## 4 컴퓨터 및 주변기기 계 2017. 01 422384
## 5 컴퓨터 및 주변기기 인터넷쇼핑 2017. 01 288391
## 6 컴퓨터 및 주변기기 모바일쇼핑 2017. 01 133993
tail(my_tidy)
## # A tibble: 6 x 4
## 상품군별 판매매체별 YM Revenue
## <chr> <chr> <chr> <dbl>
## 1 기타서비스 계 2019. 01 p) 78617
## 2 기타서비스 인터넷쇼핑 2019. 01 p) 45390
## 3 기타서비스 모바일쇼핑 2019. 01 p) 33227
## 4 기타 계 2019. 01 p) 243517
## 5 기타 인터넷쇼핑 2019. 01 p) 118596
## 6 기타 모바일쇼핑 2019. 01 p) 124921
Task 3: YM 변수의 값을 깔끔하게 정리
head(my_tidy)와 tail(my_tidy)에서 YM 부분의 일관성이 떨어지는 것이 보입니다.
unique(my_tidy$YM)
## [1] "2017. 01" "2017. 02" "2017. 03" "2017. 04" "2017. 05"
## [6] "2017. 06" "2017. 07" "2017. 08" "2017. 09" "2017. 10"
## [11] "2017. 11" "2017. 12" "2018. 01" "2018. 02" "2018. 03"
## [16] "2018. 04" "2018. 05" "2018. 06" "2018. 07" "2018. 08"
## [21] "2018. 09" "2018. 10" "2018. 11" "2018. 12 p)" "2019. 01 p)"
my_tidy$YM <- paste(substr(my_tidy$YM, 1, 4), substr(my_tidy$YM, 7, 8), sep = "-")
unique(my_tidy$YM)
## [1] "2017-01" "2017-02" "2017-03" "2017-04" "2017-05" "2017-06" "2017-07"
## [8] "2017-08" "2017-09" "2017-10" "2017-11" "2017-12" "2018-01" "2018-02"
## [15] "2018-03" "2018-04" "2018-05" "2018-06" "2018-07" "2018-08" "2018-09"
## [22] "2018-10" "2018-11" "2018-12" "2019-01"
Task 4: Y와 M도 생성
my_tidy <- my_tidy %>%
mutate(Y = substr(YM, 1, 4) %>% as.numeric(),
M = substr(YM, 6, 7) %>% as.numeric())
- 아래 코드로도 가능합니다. (classical way)
my_tidy$Y <- as.numeric(substr(YM, 1, 4))
my_tidy$M <- as.numeric(substr(YM, 6, 7))
my_tidy %>% head()
## # A tibble: 6 x 6
## 상품군별 판매매체별 YM Revenue Y M
## <chr> <chr> <chr> <dbl> <dbl> <dbl>
## 1 합계 계 2017-01 7310479 2017 1
## 2 합계 인터넷쇼핑 2017-01 3390183 2017 1
## 3 합계 모바일쇼핑 2017-01 3920295 2017 1
## 4 컴퓨터 및 주변기기 계 2017-01 422384 2017 1
## 5 컴퓨터 및 주변기기 인터넷쇼핑 2017-01 288391 2017 1
## 6 컴퓨터 및 주변기기 모바일쇼핑 2017-01 133993 2017 1
Task 5: Tidy dataset 완성 확인
my_tidy %>% str()
## Classes 'tbl_df', 'tbl' and 'data.frame': 1800 obs. of 6 variables:
## $ 상품군별 : chr "합계" "합계" "합계" "컴퓨터 및 주변기기" ...
## $ 판매매체별: chr "계" "인터넷쇼핑" "모바일쇼핑" "계" ...
## $ YM : chr "2017-01" "2017-01" "2017-01" "2017-01" ...
## $ Revenue : num 7310479 3390183 3920295 422384 288391 ...
## $ Y : num 2017 2017 2017 2017 2017 ...
## $ M : num 1 1 1 1 1 1 1 1 1 1 ...
- 이제 전처리가 끝났습니다. 변수의 순서를 바꾸고 정렬하여
dataset이라는 이름을 붙여주고 분석을 진행해보겠습니다.
dataset <- my_tidy %>%
select(YM, Y, M, 상품군별, 판매매체별, Revenue) %>%
arrange(YM, Y, M, 상품군별, 판매매체별, Revenue)
head(dataset)
## # A tibble: 6 x 6
## YM Y M 상품군별 판매매체별 Revenue
## <chr> <dbl> <dbl> <chr> <chr> <dbl>
## 1 2017-01 2017 1 e쿠폰서비스 계 88648
## 2 2017-01 2017 1 e쿠폰서비스 모바일쇼핑 74432
## 3 2017-01 2017 1 e쿠폰서비스 인터넷쇼핑 14216
## 4 2017-01 2017 1 가구 계 188602
## 5 2017-01 2017 1 가구 모바일쇼핑 105397
## 6 2017-01 2017 1 가구 인터넷쇼핑 83204
IV. 판매매체별분석 (계, 모바일쇼핑, 인터넷쇼핑)
head(dataset)
## # A tibble: 6 x 6
## YM Y M 상품군별 판매매체별 Revenue
## <chr> <dbl> <dbl> <chr> <chr> <dbl>
## 1 2017-01 2017 1 e쿠폰서비스 계 88648
## 2 2017-01 2017 1 e쿠폰서비스 모바일쇼핑 74432
## 3 2017-01 2017 1 e쿠폰서비스 인터넷쇼핑 14216
## 4 2017-01 2017 1 가구 계 188602
## 5 2017-01 2017 1 가구 모바일쇼핑 105397
## 6 2017-01 2017 1 가구 인터넷쇼핑 83204
library(ggplot2)
library(plotly)
options(scipen=999) # Avoid scientific expression e.g.) 1e+05
unique(dataset$상품군별)
## [1] "e쿠폰서비스" "가구" "가방"
## [4] "가전·전자·통신기기" "기타" "기타서비스"
## [7] "농축수산물" "문화 및 레저서비스" "사무·문구"
## [10] "생활용품" "서적" "스포츠·레저용품"
## [13] "신발" "아동·유아용품" "애완용품"
## [16] "여행 및 교통서비스" "음·식료품" "음식서비스"
## [19] "의복" "자동차용품" "컴퓨터 및 주변기기"
## [22] "패션용품 및 액세서리" "합계" "화장품"
fig1 <- ggplot(dataset %>% filter(상품군별=="합계"),
aes(x = YM, y = Revenue, color = 판매매체별)) +
geom_point() +
geom_line(aes(group = 판매매체별)) +
labs(x = "", title = "온라인 매출 동향 (단위: 백만원)") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))
fig1 %>% ggplotly()
fig2 <- ggplot(dataset,
aes(x = YM, y = Revenue, color = 판매매체별)) +
geom_point() +
geom_line(aes(group = 판매매체별)) +
labs(x = "", title = "온라인 매출 동향 (단위: 백만원)") +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
facet_wrap(~ 상품군별)
ggsave(plot = fig2, filename = "data/fig2.png", dpi = 300, width = 20, height = 10)
fig2b <- fig2 + facet_wrap(~ 상품군별, scales = "free_y", ncol = 2) # google: "facet to have different y axis"
ggsave(plot = fig2b, filename = "data/fig2b.png", dpi = 300, width = 8, height = 24)